nanomsg的前身是ZeroMQ。本人也是先接觸到ZeroMQ,畢竟ZeroMQ相關資源豐富,較易上手。官方提供了很好的解釋兩者之間的差異(Differences between nanomsg and ZeroMQ)。
由於nanomsg的sample code整理較少,故引用ZeroMQ範例,並改成nanomsg。
//  Hello World server
#include <stdio.h>
#include <thread>
#include "nn.h"
#include "reqrep.h"
int main(void)
{
	int responder = nn_socket(AF_SP, NN_REP);
	int rc = nn_bind(responder, "tcp://127.0.0.1:5555");
	if (rc < 0) exit(1);
	while (1) {
		char *buffer = NULL;
		nn_recv(responder, &buffer, NN_MSG, 0);
		printf("Received %s\n", buffer);
		nn_freemsg(buffer);
		std::this_thread::sleep_for(std::chrono::milliseconds(1));
		nn_send(responder, "World", 5, 0);
	}
	return 0;
}
//  Hello World client
#include <stdio.h>
#include "nn.h"
#include "reqrep.h"
int main(void)
{
	printf("Connecting to hello world server\n");
	int requester = nn_socket(AF_SP, NN_REQ);
	int rc = nn_connect(requester, "tcp://127.0.0.1:5555");
	for (int i = 0;; ++i) {
		char *buffer = NULL;
		printf("Sending Hello %d\n", i);
		nn_send(requester, "Hello", 5, 0);
		nn_recv(requester, &buffer, NN_MSG, 0);
		printf("Received %s %d\n", buffer, i);
        nn_freemsg(buffer);
	}
	nn_close(requester);
	return 0;
}
比較後可以發現,API其實很好置換。
| ZeroMQ | nanomsg | 
|---|---|
zmq_socket | 
nn_socket | 
zmq_bind | 
nn_bind | 
zmq_connect | 
nn_connect | 
zmq_send | 
nn_send | 
zmq_recv | 
nn_recv | 
zmq_close | 
nn_close | 
zmq_ctx_new | 
- | 
zmq_ctx_destroy | 
- |